import axios from "axios";
import {h} from "vue";
import {ElNotification} from "element-plus";
import {user} from "@/store/index";
import * as appConfig from "@/config/config";
import {getNoticeType} from "@/utils/tool.js";

// 创建一个 axios 实例
const http = axios.create({
    timeout: 10000, // 请求超时时间毫秒
    withCredentials: true, // 异步请求携带cookie
    headers: {
        // 设置后端需要的传参类型
        "Content-Type": "application/json",
        "X-Requested-With": "XMLHttpRequest",
    },
    baseURL: appConfig.config.BASE_URL
});

// 添加请求拦截器
http.interceptors.request.use(
    function (config) {
        const userStore = user();
        if (userStore.getToken) {
            Object.assign(config.headers, {
                Authorization: userStore.getToken,
            });
        }
        Object.assign(config.headers, {
            'app-id': appConfig.config.APP_ID,
            'tenant-id': appConfig.config.TENANT_ID,
        });
        // 在发送请求之前做些什么
        return config;
    },
    function (error) {
        // 对请求错误做些什么
        console.log(error);
        return Promise.reject(error);
    }
);

// 添加响应拦截器
http.interceptors.response.use(
    function (response) {
        // 对响应数据做点什么
        // dataAxios 是 axios 返回数据中的 data
        const dataAxios = response.data;
        const {code, msg} = dataAxios;
        switch (code + "") {
            case "0":
                break;
            case "200":
                break;
            default:
                // 表示给用户一些提示
                ElNotification({
                    offset: 60,
                    title: "温馨提示",
                    message: h("div", {style: "color: #e6c081; font-weight: 600;"}, msg || "服务端错误"),
                    type: getNoticeType(),
                });
                break;
        }
        return dataAxios;
    },
    function (error) {
        if (error.code && error.message) {
            // 403 表示用户未登录，或者token过期了
            ElNotification({
                offset: 60,
                title: "错误提示",
                message: h(
                    "div",
                    {style: "color: #f56c6c; font-weight: 600;"},
                    error.code + ':' + error.message
                ),
                type: getNoticeType(),
            });
            return Promise.reject(error);
        }
        // 超出 2xx 范围的状态码都会触发该函数。
        // 对响应错误做点什么
        const {status, data} = error.response;

        switch (status + "") {
            case "401":
                // 403 表示用户未登录，或者token过期了
                ElNotification({
                    offset: 60,
                    title: "错误提示",
                    message: h(
                        "div",
                        {style: "color: #f56c6c; font-weight: 600;"},
                        data.message || "登录过期"
                    ),
                    type: getNoticeType(),
                });
                // 进行重新登录
                // eslint-disable-next-line no-case-declarations
                const userStore = user();
                userStore.clearUserInfo();
                userStore.setShowLogin(true);
                break;
            case "403":
                // 403 表示权限不足
                ElNotification({
                    offset: 60,
                    title: "错误提示",
                    message: h(
                        "div",
                        {style: "color: #f56c6c; font-weight: 600;"},
                        data.message || "权限不足"
                    ),
                    type: getNoticeType(),
                });
                break;
            case "404":
                ElNotification({
                    offset: 60,
                    title: "错误提示",
                    message: h("div", {style: "color: #f56c6c; font-weight: 600;"}, "接口没有找到"),
                    type: getNoticeType(),
                });
                break;
            case "408":
                // 205 表示给用户一些提示
                ElNotification({
                    offset: 60,
                    title: "温馨提示",
                    message: h(
                        "div",
                        {style: "color: #e6c081; font-weight: 600;"},
                        data.message || "服务端错误"
                    ),
                    type: getNoticeType(),
                });
                break;
            case "500":
                ElNotification({
                    offset: 60,
                    title: "错误提示",
                    message: h(
                        "div",
                        {style: "color: #f56c6c; font-weight: 600;"},
                        data.message || "服务端错误"
                    ),
                    type: getNoticeType(),
                });
                break;
            default:
                return;
        }
        return Promise.reject(error);
    }
);

export default http;
